package com.redis.tool;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.StandardCharsets;

import com.google.gson.Gson;
import com.redis.tool.val.BasicKeyValue;
import com.redis.tool.val.HashKeyValue;
import com.redis.tool.val.ListKeyValue;
import com.redis.tool.val.SetKeyValue;
import com.redis.tool.val.StringKeyValue;
import com.redis.tool.val.ZSetKeyValue;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class ImportRedisUtil {
	public static JedisPool jedisPool = null;  
	// Redis服务器IP  
	private static String ADDR = "192.168.1.145";  
	// Redis的端口号  
	private static int PORT = 6379;  
	// 访问密码  
	private static String AUTH = "yyyyyyyy";  

	/** 
	 * 初始化Redis连接池 
	 */  
	static {  
		try {  
			JedisPoolConfig config = new JedisPoolConfig();  
			// 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true  
			config.setBlockWhenExhausted(true);  
			// 设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)  
			config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");  
			// 是否启用pool的jmx管理功能, 默认true  
			config.setJmxEnabled(true);  
			// 最大空闲连接数, 默认8个 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。  
			config.setMaxIdle(8);  
			// 最大连接数, 默认8个  
			config.setMaxTotal(200);  
			// 表示当borrow(引入)一个jedis实例时，最大的等待时间，如果超过等待时间，则直接抛出JedisConnectionException；  
			config.setMaxWaitMillis(1000 * 100);  
			// 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；  
			config.setTestOnBorrow(true);  
			jedisPool = new JedisPool(config, ADDR, PORT, 3000,AUTH,Common.dataIndex);    
		} catch (Exception e) {  
			e.printStackTrace();  
		}  
	}  
	/** 
	 * 获取Jedis实例 
	 *  
	 * @return 
	 */  
	public synchronized static Jedis getJedis() {  
		try {  
			if (jedisPool != null) {  
				Jedis resource = jedisPool.getResource();  
				return resource;  
			} else {  
				return null;  
			}  
		} catch (Exception e) {  
			e.printStackTrace();  
			return null;  
		}  
	}  

	/** 
	 * 释放jedis资源 
	 *  
	 * @param jedis 
	 */  
	public static void close(final Jedis jedis) {  
		if (jedis != null) {  
			jedis.close();  
		}  
	}  

	public static void doLoad(Jedis jedis,String detaPath) {
		File targetFile = new File(detaPath);
		try ( FileReader fileReader = new FileReader(targetFile);
				BufferedReader br = new BufferedReader(fileReader); ){
			String line;
			while((line = br.readLine()) != null){
				line = line.trim();
				if("".equals(line)){
					continue;
				}
				operatorAddRedis(jedis,line.toString());
			};

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (jedis != null) {
				jedis.close();
			}

		}
		System.out.println("Complete!");
	}

	public static void operatorAddRedis(Jedis jedis,String line) {
		Gson gson = new Gson();
		System.out.println(line);
		BasicKeyValue basicKeyValue = gson.fromJson(line,BasicKeyValue.class);
		if("string".equals(basicKeyValue.type)){
			StringKeyValue.loadJsonIntoRedis(jedis,line);
		}else if("zset".equals(basicKeyValue.type)){
			ZSetKeyValue.loadJsonIntoRedis(jedis,line);
		}else if("set".equals(basicKeyValue.type)){
			SetKeyValue.loadJsonIntoRedis(jedis,line);
		}else if("list".equals(basicKeyValue.type)){
			ListKeyValue.loadJsonIntoRedis(jedis,line);
		}else if("hash".equals(basicKeyValue.type)){
			HashKeyValue.loadJsonIntoRedis(jedis,line);
		}
	}

	public static void main(String[] args) {
		Jedis jedis =	getJedis();
		doLoad(jedis,Common.FILE_PATH);
		jedisPool.close();
	}
}
